package com.gxc.tree;

import javax.swing.text.Style;
import java.util.*;

/**
 * 在一颗树中，每个节点代表一个家庭成员，节点的数字表示其个人的财富值，一个节点及其直接相连的子节点被定义为一个小家庭。
 *
 * 现给你一颗树，请计算出最富裕的小家庭的财富和。
 *
 * 输入描述
 * 第一行为一个数 N，表示成员总数，成员编号 1~N。1 ≤ N ≤ 1000
 *
 * 第二行为 N 个空格分隔的数，表示编号 1~N 的成员的财富值。0 ≤ 财富值 ≤ 1000000
 *
 * 接下来 N -1 行，每行两个空格分隔的整数（N1, N2），表示 N1 是 N2 的父节点。
 *
 * 输出描述
 * 最富裕的小家庭的财富和
 */
public class RichFamily {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Map<Integer, Integer> moneyMap = new HashMap<>();
        for (int i = 0; i < n; i++) {
            moneyMap.put(i+1, scanner.nextInt());
        }
        scanner.nextLine();
        Map<Integer, Set<Integer>> rel = new HashMap<>();
        for (int i = 0; i < n-1; i++) {
            String str = scanner.nextLine();
            String[] split = str.split(" ");
            rel.computeIfAbsent(Integer.parseInt(split[0]), v -> new HashSet<>()).add(Integer.parseInt(split[1]));
        }
        scanner.close();

        int max = 0;
        for (Map.Entry<Integer, Set<Integer>> entry : rel.entrySet()) {
            Integer key = entry.getKey();
            Set<Integer> value = entry.getValue();
            int sum = 0;
            for (Integer i : value) {
                sum += moneyMap.get(i);
            }
            sum += moneyMap.get(key);
            max = Math.max(max, sum);
        }
        System.out.println(max);
    }
}
